package org.compression.config;


import java.sql.SQLException;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;

import com.alibaba.druid.pool.DruidDataSource;




@Configuration
public class DataSourcesConfig {
	
	 private static final Logger LOGGER = LoggerFactory.getLogger(DataSourcesConfig.class);
	 
	    @Value("${spring.datasource.driverClassName}")
	    private String driverClassName;
	    @Value("${spring.datasource.url}")
	    private String url;
	    @Value("${spring.datasource.username}")
	    private String username;
	    @Value("${spring.datasource.password}")
	    private String password;
	    @Value("${spring.datasource.initialSize}")
	    private int initialSize;
	    @Value("${spring.datasource.minIdle}")
	    private int minIdle;
	    @Value("${spring.datasource.maxActive}")
	    private int maxActive;
	    @Value("${spring.datasource.maxWait}")
	    private int maxWait;
	    @Value("${spring.datasource.validationQuery}")
	    private String validationQuery;
	    @Value("${spring.datasource.testOnBorrow}")
	    private boolean testOnBorrow;
	    @Value("${spring.datasource.testOnReturn}")
	    private boolean testOnReturn;
	    @Value("${spring.datasource.testWhileIdle}")
	    private boolean testWhileIdle;
	    @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
	    private int timeBetweenEvictionRunsMillis;
	    @Value("${spring.datasource.minEvictableIdleTimeMillis}")
	    private int minEvictableIdleTimeMillis;
	    @Value("${spring.datasource.removeAbandoned}")
	    private boolean removeAbandoned;
	    @Value("${spring.datasource.removeAbandonedTimeout}")
	    private int removeAbandonedTimeout;
	    @Value("${spring.datasource.logAbandoned}")
	    private boolean logAbandoned;
	    @Value("${spring.datasource.filters}")
	    private String filters;
	    @Value("${spring.datasource.poolPreparedStatements}")
	    private boolean poolPreparedStatements;
	    @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")
	    private int maxPoolPreparedStatementPerConnectionSize;
	 
	    @Bean
	    @Primary
	    public DataSource dataSource() {
	        DruidDataSource datasource = new DruidDataSource();
	 
	        datasource.setDriverClassName(driverClassName);
	        datasource.setUrl(url);
	        datasource.setUsername(username);
	        datasource.setPassword(password);
	        //其它配置
	        datasource.setInitialSize(initialSize);
	        datasource.setMinIdle(minIdle);
	        datasource.setMaxActive(maxActive);
	        datasource.setMaxWait(maxWait);
	        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
	        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
	        datasource.setValidationQuery(validationQuery);
	        datasource.setTestWhileIdle(testWhileIdle);
	        datasource.setTestOnBorrow(testOnBorrow);
	        datasource.setTestOnReturn(testOnReturn);
	        datasource.setPoolPreparedStatements(poolPreparedStatements);
	        datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
	        try {
	            datasource.setFilters(filters);
	        } catch (SQLException e) {
	          
	        }
	        return datasource;
	    }

	
	    @Bean(name = "sqlSessionFactory")
		@Primary
		public SqlSessionFactory sqlSessionFactory() throws Exception {
			SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
			bean.setDataSource(dataSource());
			bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
			return bean.getObject();
		}


		@Bean(name = "TransactionManager")
		@Primary
		public DataSourceTransactionManager transactionManager() {
			return new DataSourceTransactionManager(dataSource());
		}

		@Bean(name = "sqlSessionTemplate")
		@Primary
		public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
			return new SqlSessionTemplate(sqlSessionFactory);
		}
	
	

}
